package com.algo.socket.server;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

public class NettyServer {

	private int port;

	public NettyServer(int port) {
		this.port = port;
	}

	public void run() throws Exception {
		EventLoopGroup bossGroup = new NioEventLoopGroup(1); 
		EventLoopGroup workerGroup = new NioEventLoopGroup();
		try {
			ServerBootstrap serverBootstrap = new ServerBootstrap(); 

			serverBootstrap.group(bossGroup, workerGroup)
						   .channel(NioServerSocketChannel.class) 
						   .childHandler(new ServerChannelInitializer())
						   .option(ChannelOption.SO_BACKLOG, 128) 
						   .childOption(ChannelOption.SO_KEEPALIVE, true); 

			ChannelFuture f = serverBootstrap.bind(port).sync(); 
			
			f.channel().closeFuture().sync();
		} finally {
			workerGroup.shutdownGracefully();
			bossGroup.shutdownGracefully();
		}
	}

	public static void main(String[] args) throws Exception {
		int port = 8080;
		if (args.length > 0) {
			port = Integer.parseInt(args[0]);
		}

		new NettyServer(port).run();
	}
}
